/**
 * 日期时间工具函数
 */

/**
 * 日期格式化
 * @param {Date|number|string} date 日期对象、时间戳或日期字符串
 * @param {string} format 格式化模式，例如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
  const d = date instanceof Date ? date : new Date(date);
  
  if (isNaN(d.getTime())) {
    console.error('无效的日期');
    return '';
  }
  
  const year = d.getFullYear();
  const month = d.getMonth() + 1;
  const day = d.getDate();
  const hours = d.getHours();
  const minutes = d.getMinutes();
  const seconds = d.getSeconds();
  
  const formatMap = {
    'YYYY': year,
    'MM': padZero(month),
    'M': month,
    'DD': padZero(day),
    'D': day,
    'HH': padZero(hours),
    'H': hours,
    'mm': padZero(minutes),
    'm': minutes,
    'ss': padZero(seconds),
    's': seconds
  };
  
  return format.replace(/(YYYY|MM|M|DD|D|HH|H|mm|m|ss|s)/g, match => formatMap[match]);
}

/**
 * 数字补零
 * @param {number} num 需要补零的数字
 * @returns {string} 补零后的字符串
 */
function padZero(num) {
  return num < 10 ? `0${num}` : `${num}`;
}

/**
 * 获取当前日期时间
 * @param {string} format 格式化模式
 * @returns {string} 当前日期时间的格式化字符串
 */
export function getCurrentDateTime(format = 'YYYY-MM-DD HH:mm:ss') {
  return formatDate(new Date(), format);
}

/**
 * 获取当前日期
 * @returns {string} 当前日期，格式为 YYYY-MM-DD
 */
export function getCurrentDate() {
  return formatDate(new Date(), 'YYYY-MM-DD');
}

/**
 * 获取当前时间
 * @returns {string} 当前时间，格式为 HH:mm:ss
 */
export function getCurrentTime() {
  return formatDate(new Date(), 'HH:mm:ss');
}

/**
 * 获取基于时间的问候语
 * @returns {string} 问候语
 */
export function getGreeting() {
  const hours = new Date().getHours();
  
  if (hours >= 0 && hours < 6) {
    return '凌晨好';
  } else if (hours >= 6 && hours < 9) {
    return '早上好';
  } else if (hours >= 9 && hours < 12) {
    return '上午好';
  } else if (hours >= 12 && hours < 14) {
    return '中午好';
  } else if (hours >= 14 && hours < 18) {
    return '下午好';
  } else if (hours >= 18 && hours < 22) {
    return '晚上好';
  } else {
    return '夜深了';
  }
}

/**
 * 获取两个日期之间的天数差
 * @param {Date|number|string} date1 第一个日期
 * @param {Date|number|string} date2 第二个日期
 * @returns {number} 天数差
 */
export function getDaysDiff(date1, date2) {
  const d1 = new Date(date1);
  const d2 = new Date(date2);
  
  // 转换为UTC日期，忽略时区差异
  const utc1 = Date.UTC(d1.getFullYear(), d1.getMonth(), d1.getDate());
  const utc2 = Date.UTC(d2.getFullYear(), d2.getMonth(), d2.getDate());
  
  // 一天的毫秒数
  const MS_PER_DAY = 1000 * 60 * 60 * 24;
  
  // 计算差值并转换为天数
  return Math.floor((utc2 - utc1) / MS_PER_DAY);
}

/**
 * 判断是否为同一天
 * @param {Date|number|string} date1 第一个日期
 * @param {Date|number|string} date2 第二个日期
 * @returns {boolean} 是否为同一天
 */
export function isSameDay(date1, date2) {
  const d1 = new Date(date1);
  const d2 = new Date(date2);
  
  return d1.getFullYear() === d2.getFullYear() &&
         d1.getMonth() === d2.getMonth() &&
         d1.getDate() === d2.getDate();
}

/**
 * 获取指定日期是星期几
 * @param {Date|number|string} date 日期
 * @returns {string} 星期几（中文）
 */
export function getDayOfWeek(date) {
  const d = new Date(date);
  const weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  return weekdays[d.getDay()];
} 